package com.leetcode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

/**
 * 139. 单词拆分
 *
 * @author yml
 * 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict，判定s 是否可以被空格拆分为一个或多个在字典中出现的单词。
 * <p>
 * 说明：
 * 拆分时可以重复使用字典中的单词。
 * 你可以假设字典中没有重复的单词。
 */
public class LeetCode139 {

    public static void main(String[] arg0) {
        String[] words = {"leet", "code"};
        String s = "leetcode";
        List<String> wordDict = new ArrayList<>(Arrays.asList(words));
        System.out.println("是否可以被空格拆分 = " + wordBreak(s, wordDict));
    }

    /**
     * 动态规划 (dynamic programming)
     * 以示例1为例，dp数组为[true, false, false, false, true, false, false, false, true]
     */
    public static boolean wordBreak(String s, List<String> wordDict) {
        HashSet<String> wordSet = new HashSet<>(wordDict); // 去除词典重复项

        int length = s.length();
        boolean[] dp = new boolean[length + 1];
        dp[0] = true;
        for (int i = 1; i <= length; i++) {
            for (int j = 0; j < i; j++) {
                if (dp[j] && wordSet.contains(s.substring(j, i))) {
                    dp[i] = true;
                    break;
                }
            }
        }

        return dp[length];
    }

}
